package com.kotlin.flong.base

/*
 *学习一
 */
fun main(args : Array<String>){
	
	//println(sum(1,2))
	
	//println(sum1(1,2))
	
	//printSum(1,2)
	//printSum1(1,2)
	
	//replace()
	
	//println(maxOf(3,5));
	//println(max1(3,5));
	//println(max1(3,5).plus(1))//找出值使用plus上面加1
	//println(max1(3,5).dec())//减一
	//println(max1(3,5).inc())//找出值使用inc会自动加1
	//println(max1(3,5).inc().div(2))//先加1再除以2
	
	
	//println(isStr("我是寅务"))
	//println(isStr(123))
	
	//biaojiaoStr1()
	//split()
	
	//subStr()
	
	//pair()
	//testNull()
	//defVal(29)
	
	println(varargs(10,20,30))
}

//计算a+b
fun sum(a: Int,b :Int) : Int{
	return a+b
}


//无return关键字的加法
fun sum1(a: Int,b : Int) = a + b

//函数返回⽆意义的值,Unit相当于void,$是占位符进行处理
fun printSum(a: Int, b: Int): Unit {
	println("sum of $a and $b is ${a + b}")
}

//无Unit
fun printSum1(a: Int, b: Int) {
	println("sum of $a and $b is ${a + b}")
}

//一次赋值（只读）的局部变量:
fun test1(){
	val a: Int = 1 // 初始化值
	val b = 2 // 类型推断出 `Int` 类型
	val c: Int // 如果没有初始值类型不能省略
	c = 3 // 明确赋值
	println(c)
}


//replace和$使用
fun replace(){
	var a = "寅务"
	val s1 = "我是 $a" //占位符模板
	println(s1)
	
	//将是改变成is
	val s2 = "${s1.replace("是", "is")}, but now is $a"
	println(s2)
}

//找最大值
fun maxOf(a: Int, b: Int): Int {
	if (a > b) {
		return a
	} else {
		return b
	}
}

//不使用return 
fun max1(a : Int ,b : Int) = if(a>b) a else b
 


//is的使用,?允许返回null，Any表示任何类型
//当某个变量的值可以为 null 的时候，必须在声明处的类型后添加 ? 来标识该引⽤可为空
fun isStr(obj : Any) : Int ?{
	
	// `obj` 在 `&&` 右边⾃动转换成 `String` 类型
	if (obj is String && obj.length > 0) {
		return obj.length
	}
	return null
}



//字符串对比
fun biaojiaoStr1(){
	
	var str1 = "abc"
	var str2 = String(charArrayOf('a','b','c'))
	
	//比较字符串的值，输出true
	println(str1.equals(str2))
	
	//比较字符串的值，输出true
	println(str1==str2)
	
	//比较字符串的内存地址，相当于Java的str1==str2，输出false
	println(str1===str2)
}


fun split(){
	var str = "苹果,香蕉-橙子"
	//支持多个特殊进行切割
	var strs = str.split(",","-")
	
	for(s in strs){
		println(s)
	}
}


//substring的使用

fun subStr(){
	val path = "/Users/ljl/kotlin/chapter.doc";
	
	//获取前6个字符
	println(path.substring(0,6))
	//使用范围获取前6个字符
	println(path.substring(0..5))
	
	//把第一个r之前的字符串截取
	println(path.substringBefore('r'))
	
	//把最后一个r之前的字符串截取
	println(path.substringBeforeLast('r'))
	
	//把第一个r之后的字符串截取
	println(path.substringAfter("r"))
	
	//把最后一个r之后的字符串截取
	println(path.substringAfterLast("r"))
	
}



//元祖使用

fun pair(){
	
	//定义一个二元元组
	var pair  = Pair<String,Int>("我是寅务",29)
	var pair1 : Pair<String,Int> = "我是寅务" to 29
	
	println(pair.first + "," +pair.second)
	println(pair1.first + "," + pair1.second)
	
	//定义一个三元元组
	var triple  = Triple<String,Int,String>("我是寅务",29,"岁")
	
	println(triple.first + "," +triple.second + "," + triple.third)
}



fun testNull(){

	// ? 可空变量类型
	val age : Int? = null
	
	// !! 非空判断
    var userName : String  = null !!
	
	// ? 表示可以为空，不加表示不能为空
    var passWord : String?  = null  

	// ?. 空安全调用符，这种做法先显眼就是为了判断非空值如同 if(age !=null) age.toI
	println(age?.toInt())
	
	//?： elvis操作符(猫王）,age?.toInt()表示if(age!=null) age.toInt else 返回 默认就给10
	var ageInt : Int = age?.toInt() ?: 10

	println(ageInt)
	
	//!!表示告诉kotlin编辑器,此值不要检查了，password一定不为空,这种值处理如果不确定的话显眼不安全。
	//不建议使用
	passWord!!.toInt()
}


//函数的参数默认
fun defVal(age:Int,username:String = "liangjl"){
	println("$username,$age")
}


//可变参数

fun varargs(vararg a : Int ):Int{
	
	var result =0
	a.forEach {
		result += it
		
	}
	return result;
}


